#include<iostream>
#include<cstring>
#include<string>
#include<unistd.h>
#include<cstdio>
#include<stdio.h>
#include<vector>
#include<stack>
#include<sys/types.h>
#include<sys/wait.h>



using namespace std;
const int basesize=1024;
const int argvsize=64;
char *gargv[argvsize];
int gargc=0;


//////////////////////////////////
//获取用户名
string GetUserName()
{
    string name=getenv("USER");
    return name.empty()?"NONE":name;
}

//获取主机名字
string GetHostName()
{
    string name=getenv("HOSTNAME");
    return name.empty()?"NONE":name;
}

string GetUserPWD()
{
    string pwd=getenv("PWD");
    return pwd.empty()?"NONE":pwd;
}


string MakeCommandLine()
{
    //输出命令行
    char CommandLine[basesize];
    snprintf(CommandLine,basesize,"[%s@%s %s]#",GetUserName().c_str(),GetHostName().c_str(),GetUserPWD().c_str());
    return CommandLine;

}   
/////////////////////////////////////////
//打印命令行起止符
void PrintCommandLine()
{
    printf("%s",MakeCommandLine().c_str());
    //直接把这个打印出来
    fflush(stdout);
}


//得到用户的指令  2
bool GetCommandBuffer(char command[],int size)
{
    //用户输入的字符串 要当成一个完整的字符串 包括空格
    //所以不建议 cin scanf
    char* Command=fgets(command,size,stdin);
    if(!Command)
    {
         return false;
    }
    //把空格的位置\n去掉了
    Command[strlen(Command)-1]=0;
    if(strlen(Command)==0)return false;

    return true;
}


//分析这个指令  5
bool AnlCommandLine(char* Command,int len)
{
    memset(gargv,0,sizeof(gargv));
    gargc=0;

     //把这个指令分割
    const char* sep=" ";
    gargv[gargc++]=strtok(Command,sep);
    while((bool)(gargv[gargc++]=strtok(nullptr,sep)));

    //全部插完之后就可以

}



//执行指令
bool ExeCommandLine()
{
    //首要任务 让子进程执行
    pid_t id=fork();
    if(id<0) return false;
    else if(id==0)//子进程
    { 
      //子进程
      //执行命令 然后退出exit()
      //exec* 接口来执行
      //
      execvp(gargv[0],gargv);

      exit(1);
    }

    int wait_stata=0;
    pid_t pid=waitpid(id,&wait_stata,0);
    if(pid>0)
    {
        //do Nothing
    
        return true;
    }

    return false;


}







//调试   1-> 
void Debug()
{
    printf("argc:%d\n",gargc-1);
    for(int i=0;i<gargc-1;i++)
    {
        printf("argv[%d]:%s\n",i,gargv[i]);
    }
}


int main()
{


    while(true)
    {

      PrintCommandLine();                  //打印命令行
      char Command_buffer[basesize];       
      if(!GetCommandBuffer(Command_buffer,basesize))  //输入命令行
      {
          //输入错误 就要重新输入
          continue;
      }


      //分析命令行
      AnlCommandLine(Command_buffer,strlen(Command_buffer));


      //调试
      //Debug();
      ExeCommandLine();





      //printf("%s\n",Command_buffer);
      sleep(1);


    }


    return 0;
}
